'''
概念：
    通过列表生成式，可以直接创建列表，所有的数据都会存到内存中，受内存的限制
列表的容量是有限的，如果列表中有10000个数据，如果我们只需要访问几个元素，后面的基本
不会访问，那么会造成内存极大的浪费。
    如果列表中的元素可以按照某种算法推导出来，那么我们再循环遍历列表时
    不断推导后面的元素，从而节省大量的内存，再python中，之中一边循环一边
    推导的机制称为生成器（generator）
'''

# 创建生成器
# 1、修改列表生成式：将列表生成式的[]改为()
li = (x * x for x in range(1, 6))
print(li)
print(type(li))
# # 生成器特点：可以通过next（）函数获得generator的下一个值
# print(next(li))
# print(next(li))
# print(next(li))
# print(next(li))
# print(next(li))
# # 将所有元素都拿出来以后再执行next会得到StopIteration异常
# # print(next(li))

# while 1:
#     print(next(g))

# 遍历
# 原理：generator保存的是算法，每次调用next（）就计算生成器下一个元素的值
# 直到抛出StopIteration错误为止
# 以后一般都是使用for循环来迭代生成器，不需要关心StopIteration异常
for i in li:
    print(i)